#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QtNetwork>
#include "Car.h"
#include "Usr.h"
#include "Management.h"
#include "myThread.h"

#define PRICE           2               //定义单价2元每小时
#define PORT            8888            //定义服务器端口号
#define CAMERA_PORT     8080            //定义车牌识别客户端连接端口

/* 定义所有命令枚举 */
enum {

    /* 登录, 注册, 预约, 支付, 注销, 取车*/
    LOGIN, JOIN, PAY, DELETE_USR, RESERVATION, PICK_CAR,

    /* 登录成功, 注册成功, 注销成功, 支付成功, 预约成功, 取车成功 */
    LOGIN_OK, JOIN_OK, DELETE_USR_OK, PAY_OK, RESERVATION_OK, PICK_CAR_OK,

    /* 未找到用户, 密码错误, 要求客户端显示字符串 */
    NOT_FOUNT_USR, PASSWORD_ERR, RESERVATION_ERR, SHOW,

};

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    QTcpServer *getServer() const;

    Management *getMan() const;

public slots:

    /**************************************
    * 作者: 勇哥
    * 日期: 2019年3月28日
    * 函数名称: connectSlot
    * 函数功能: 处理连接请求的槽函数
    * 函数参数: void
    * 函数返回值: void
    *
    ***************************************/
    void connectSlot();

    void connectCameraSlot();

    /**************************************
    * 作者: 勇哥
    * 日期: 2019年3月28日
    * 函数名称: recvInfoSlot
    * 函数功能: 接收并处理客户端命令和数据的槽函数
    * 函数参数: void
    * 函数返回值: void
    *
    ***************************************/
    void recvInfoSlot();
    void recvCameraInfoSlot();

private:
    Ui::Widget *ui;
    QTcpServer *Server;
    QTcpServer *ServerCamera;
    QTcpSocket *Socket;
    QTcpSocket *SocketCamera;
    Management *man;
    //myThread *thread;

    /**************************************
    * 作者: 勇哥
    * 日期: 2019年3月28日
    * 函数名称: sendInfo
    * 函数功能: 内部私有函数,发送命令和数据
    * 函数参数:
    *   int cmd: 命令
    *   const QString &data: 数据,可不关注
    * 函数返回值: void
    *
    ***************************************/
    void sendInfo(int cmd, const QString &data = "");

    /**************************************
    * 作者: 勇哥
    * 日期: 2019年3月28日
    * 函数名称: updateUI
    * 函数功能: 内部私有函数更新ui界面显示信息
    * 注意事项: 每次更新显示前请手动调用 "man->setCar()" 函数!!!
    * 函数参数: void
    * 函数返回值: void
    *
    ***************************************/
    void updateUI();

};

#endif // WIDGET_H
